package com.zhaorui.aop;

import cn.hutool.json.JSONUtil;
import com.zhaorui.entity.SysLog;
import com.zhaorui.service.SysLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;

@Aspect
@Component
public class LogAnnotation2 {
    @Autowired
    private SysLogService sysLogService;

    @Pointcut("@annotation(Annotation2)")
    //切点
    private void permissionCheck() {
    }

    //before：取：Annotation2中的tableName和optionName，用这个方法比较简单
    @Before("permissionCheck()&& @annotation(annotation2)")
    public void logAdvice(JoinPoint joinPoint, Annotation2 annotation2) {//连接点对象
        System.out.println ("aop开始工作");
        // 这里只是一个示例，你可以写任何处理逻辑
        Object arg = joinPoint.getArgs ()[0];
        System.out.println ("目标对方法的参数" + arg);
        String tableName = annotation2.tableName ();
        String optionName = annotation2.optionName ();

        System.out.println ("目标对方法的注解" + tableName + "-----" + optionName + "----");
        //接收操作的具体数据
        String logcontent = "";
        if (("删除").equals (optionName)) {//删除中才有主键字段名
            //拿到id
            Integer id = (Integer) joinPoint.getArgs ()[0];
            //拿主键字段
            String primaryKeyName = annotation2.primaryKeyName ();
            //添加和修改获取数据本身，删除是id，需要去查询
            HashMap hashMap = new HashMap ();
            hashMap.put ("tableName", tableName);
            hashMap.put ("primaryKeyName", primaryKeyName);
            hashMap.put ("id", id);
            //调方法
            HashMap map = sysLogService.queryByInfo (hashMap);
            if (map == null && map.isEmpty ()) {
                logcontent = "无数据，无更改";
            } else {//赋值
                logcontent = JSONUtil.toJsonStr (map);
            }

        } else {//添加修改
            logcontent = JSONUtil.toJsonStr (arg);

        }
        //new一个对象
        SysLog sysLog = new SysLog ();
        //表面名
        sysLog.setTablename (tableName);
        //操作的动作
        sysLog.setOperation (optionName);
        //操作的内容
        sysLog.setLogcontent (logcontent);
        //调用服务层直接插入
        sysLogService.save (sysLog);

    }

    //after
    @After("permissionCheck()")
    public void logAdvice2() {
        // 这里只是一个示例，你可以写任何处理逻辑
        System.out.println ("aop888888");
    }

}
